# file_python|auto_accept_friend.py|微信批量通过好友脚本

# 1.元素定位稳定性：
# 微信界面可能随版本更新变化（如元素 ID 或文本修改），需用 Appium Inspector 重新获取最新元素属性。
# 推荐使用resource-id定位（更稳定），若 ID 变化，可结合XPATH（如//*[contains(@text, "通过验证")]）。

# 2.防封号策略：
# 添加随机延迟（如time.sleep(random.uniform(1.5, 3))），模拟真人操作节奏。
# 限制单次处理的请求数量（如最多处理 5 个），避免触发微信风控。

# 4.多设备支持：
# 若需控制多台设备，可通过不同的deviceName和端口（如 4723、4725）启动多个 Appium Server 实例。
import time
import random
from appium import webdriver
from appium.webdriver.common.appiumby import AppiumBy
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# ==================== 配置项 ====================
DESIRED_CAPS = {
    "platformName": "Android",
    "platformVersion": "12",  # 替换为你的设备系统版本
    "deviceName": "SM-G988N",  # 替换为你的设备名（adb devices查看）
    "appPackage": "com.tencent.mm",
    "appActivity": "com.tencent.mm.ui.LauncherUI",  # 启动Activity（可能变化）
    "noReset": True,  # 不重置应用状态（保留登录）
    "unicodeKeyboard": True,  # 支持中文输入
    "resetKeyboard": True  # 测试后恢复键盘
}

QUESTIONS = [
    "你好呀～最近在忙什么？",
    "请问你是通过什么渠道加我的呀？",
    "最近有什么推荐的电影或书吗？",
    "平时喜欢什么类型的活动？",
    "今天天气不错，你那边怎么样？"
]  # 预设随机问题

# ==================== 核心函数 ====================
def wait_for_element(driver, locator, timeout=15):
    """等待元素出现（带超时）"""
    return WebDriverWait(driver, timeout).until(
        EC.presence_of_element_located(locator)
    )

def auto_accept_friend():
    # 初始化Appium驱动
    driver = webdriver.Remote("http://localhost:4723/wd/hub", DESIRED_CAPS)
    driver.implicitly_wait(10)  # 全局隐式等待

    try:
        # 步骤1：进入「通讯录」页面
        通讯录按钮 = wait_for_element(driver, (AppiumBy.XPATH, '//*[@text="通讯录"]'))
        通讯录按钮.click()
        time.sleep(2)  # 等待页面切换

        # 步骤2：进入「新的朋友」页面
        新的朋友入口 = wait_for_element(driver, (AppiumBy.XPATH, '//*[@text="新的朋友"]'))
        新的朋友入口.click()
        time.sleep(2)

        # 步骤3：获取所有「通过验证」按钮（未通过的请求）
        通过按钮列表 = driver.find_elements(
            AppiumBy.XPATH, '//*[@text="通过验证"]'
        )
        if not 通过按钮列表:
            print("没有未通过的好友请求")
            return

        # 遍历处理每个请求
        for 按钮 in 通过按钮列表:
            # 点击「通过验证」（可能需要滑动到可见区域）
            driver.execute_script("mobile: scrollTo", {"element": 按钮.id})  # 滑动到按钮可见
            按钮.click()
            time.sleep(3)  # 等待验证通过并跳转聊天界面

            # 步骤4：发送随机问题
            try:
                # 等待消息输入框加载
                输入框 = wait_for_element(driver, (
                    AppiumBy.ID, "com.tencent.mm:id/a5_"  # 输入框ID（需根据实际确认）
                ))
                随机问题 = random.choice(QUESTIONS)
                输入框.send_keys(随机问题)
                time.sleep(2)

                # 点击「发送」按钮
                发送按钮 = wait_for_element(driver, (AppiumBy.XPATH, '//*[@text="发送"]'))
                发送按钮.click()
                print(f"已发送问题：{随机问题}")
                time.sleep(2)
            except Exception as e:
                print(f"发送消息失败：{str(e)}")
                driver.back()  # 返回上一页
                time.sleep(2)
                continue

            # 返回「新的朋友」页面
            driver.back()
            time.sleep(2)

        print("所有好友请求处理完成")
    except Exception as e:
        print(f"脚本异常：{str(e)}")
    finally:
        driver.quit()

# ==================== 执行入口 ====================
if __name__ == "__main__":
    auto_accept_friend()